// 根据每日气温列表，请重新生成一个列表，
// 对应位置的输出是需要再等待多久温度才会升高超过该日的天数。
// 如果之后都不会升高，请在该位置用 0 来代替。

// 例如，给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73]，
// 你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

// 提示：气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度，都是在 [30, 100] 范围内的整数。


function dailyTemperatures(T: number[]): number[] {
    const res: number[] = new Array(T.length).fill(0);// 初始化结果数组赋值为0
    const stack: number[] = [];// 初始化单调栈
    for (let i = 0; i < T.length; i++) {
        // 如果当前元素大于栈顶元素就进入循环，用当前元素下标与出栈元素作差
        // 差值即为当前元素下标对应值
        while (stack.length > 0 && T[i] > T[stack[stack.length - 1]]) {
            res[stack[stack.length - 1]] = i - (stack.pop() as number);
        }
        // 默认情况下，入栈当前元素下标
        stack.push(i);
    }
    return res;
};

// 这道题的解法是使用一个单调栈，严格来说栈里面只有从下往上的递减元素
// 首先主循环是遍历整个数组
// 默认情况下入栈当前元素的下标（这个入栈元素的选取很微妙）
// 而如果在主循环中栈不空，且当前元素大于栈顶元素，
// 那么如果直接入栈的话就不满足递减单调栈，
// 所以需要取出栈顶的元素，由于当前元素大于栈顶元素的数字，
// 所以它一定是第一个大于栈顶元素的数，直接求出下标差就是二者的距离。
// 把它放在结果数组的对应下标位置上
// 然后我们在这个次循环中，不断对栈顶元素做出栈与当前元素的比较即可
